package kded.demo.botp;

import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.metadata.IDataEntityProperty;
import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
import kd.bos.db.DB;
import kd.bos.entity.ExtendedDataEntity;
import kd.bos.entity.botp.plugin.AbstractConvertPlugIn;
import kd.bos.entity.botp.plugin.args.AfterFieldMappingEventArgs;
import kd.bos.entity.botp.runtime.ConvertConst;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.operation.SaveServiceHelper;

import java.util.List;

/**
 * 因为目前最新的苍穹已经支持botp携带多选基础资料数据，所以用目前还不支持的附件转换演示。
 * https://dev.kingdee.com/index/docsNew/1b5888b5-0295-403a-8433-cd35623ef2eb
 * caijiasheng
 */
public class ModifyTargetData extends AbstractConvertPlugIn {
    /**
     * 按照字段映射配置，把源单字段值，填写到了目标单字段上之后，触发此事件。
     * 插件可以在此事件中，对目标单字段值，进行修订、计算、汇总等，或者根据生成的目标单字段值，进行拆单、拆行。
     *
     * 携带附件到下游单据
     * https://vip.kingdee.com/questions/83158944604333056
     *
     * 关注点：
     * 1、获取原单以及下游单据数据
     * 2、处理无法通过单据转换的字段数据
     *
     * @param e e
     */
    @Override
    public void afterFieldMapping(AfterFieldMappingEventArgs e) {
        // 取目标单，单据头数据包 （可能会生成多张单，是个数组）
        String targetEntityNumber = this.getTgtMainType().getName();
        ExtendedDataEntity[] billDataEntities = e.getTargetExtDataEntitySet().FindByEntityKey(targetEntityNumber);
        // 逐单处理
        for(ExtendedDataEntity billDataEntity : billDataEntities) {

            // 取原单数据 kded_apply
            List<DynamicObject> srcRows = (List<DynamicObject>)billDataEntity.getValue(ConvertConst.ConvExtDataKey_SourceRows);
            DynamicObject srcRow = srcRows.get(0);
            Object id = e.getFldProperties().get("id").getValue(srcRow);//获取源单字段数据
            //得到id到数据库重新拉一遍数据,拿到附件
            DynamicObject srcData = BusinessDataServiceHelper.loadSingle(id, "kded_apply", "kded_attachmentfield");
            //获取附件信息 att_bd
            DynamicObjectCollection srcFiles = srcData.getDynamicObjectCollection("kded_attachmentfield");
            DynamicObject att_bd = srcFiles.get(0);//只取一条数据测试使用

            //插入目标单据
            DynamicObject targetData = billDataEntity.getDataEntity();
            //获取下游单据附件字段attCol
            DynamicObjectCollection attCol = targetData.getDynamicObjectCollection("kded_attachmentfield");
            //根据上游附件详情信息copy一条 并插入
            DynamicObject bd = copyAttachBd(att_bd.getDynamicObject("fbasedataid"));
            SaveServiceHelper.save(new DynamicObject[] {bd});
            //创建附件字段信息  (对应的是附件字段的表结构)
            DynamicObject attField = new DynamicObject(attCol.getDynamicObjectType());
            attField.set("fbasedataid", bd);
            attField.set("fbasedataid_id", bd.getPkValue());
            //将附件字段信息加到附件字段集合
            attCol.add(attField);
            //插入下游单据

        }
    }


    private DynamicObject copyAttachBd(DynamicObject att_bd) {
        DynamicObject newObj = BusinessDataServiceHelper.newDynamicObject(att_bd.getDataEntityType().getName());
        DataEntityPropertyCollection properties = att_bd.getDataEntityType().getProperties();
        for(IDataEntityProperty p1:properties) {
            //id 和 multilanguagetext不用设置 设置了会导致字段的重复
            if(!p1.getName().equals("id") &&  !p1.getName().equals("multilanguagetext")) {
                //uid加了索引，因此不能重复    粗略可以使用下面的策略       原本的生成策略没有找到
                if(p1.getName().equals("uid")) {
                    newObj.set("uid", DB.genLongId(""));
                }else {
                    Object value = att_bd.get(p1);
                    newObj.set(p1, value);
                }
            }
        }
        return newObj;
    }

}
